package login;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//这个Servlet用来动态的生成主页面
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //此处禁止创建会话，如果没找到，用户就是未登录状态
        //如果找到了才认为是登录状态
        //这里和前边的创建session不一样，这里的目的只能是查询
        //要想创建，就必须是登录成功之后才能创建
        //此处浏览器跳转到这个界面，没有登录也不能创建session了
       HttpSession session = req.getSession(false);
       if (session == null) {
           //当前是未登录状态
           resp.setContentType("text/html;charset=utf8");
           resp.getWriter().write("当前用户未登录！");
           return;
       }
       //此时如果有session了并且登录成功了，就把这个username拿到
        //此时这个session和刚才未登录时创建的session时同一个对象，这因为sessionId时一样的
        //这里得到的username对应的value是object类型，需要强转成String类型
       String username = (String) session.getAttribute("username");
       if (username == null) {
           //虽然有session对象，但是里面没有必要的属性，我们也认为是登录状态异常
           resp.setContentType("text/html;charset=utf8");
           resp.getWriter().write("当前用户未登录！");
           return;
       }

       //如果上述的校验都是ok的，此时就生成一个动态的页面
       resp.setContentType("text/html;charset=utf8");
       resp.getWriter().write("欢迎你！" + username);
    }
}
/*在服务器这边，servlet内部维护了一个全局的哈希表，key就是sessionId，value就是session对象
* 通过getSession方法，其实就是在操作这个全局的哈希表*/

/*上述session也不会一直存在下去，比如服务器重新启动，原来hash表中的内容就没了
* 此时再次访问，就可能出现sessionId无法查询到，于是就被识别成了“未登录” 状态了
* 服务器默认保存会话是在内存中的，一旦重启服务器，之前的会话数据就没了*/

/*但是Smart tomcat为了方便程序猿调试程序，会在停止服务器的时候，把会话持久化保存
* 并且在下次启动的时候，自动把会话恢复到内存中，此时会话数据是不会丢失的*/

/*上述这一套是否生效，和smart tomcat 版本有关，不同的版本可能会支持会话保存，也可能不支持
* 但是如果手动部署程序到tomcat，则会话默认还是在内存中，重启服务器还是会丢失会话*/